在這個章節,我們將探討 Robot Framework 中的控制結構(Control Structures)及其用法。這些結構是實現複雜邏輯的基礎,能夠根據不同情況動態調整測試案例的執行流。這部分涵蓋了大家熟悉的 for loop 和 if-else 等結構。然而,這也是部分使用者覺得 Robot Framework 不太直觀的地方。讓我們一同深入了解,並一同探討看法吧!
在測試中,經常需要進行邏輯判斷。比如說在第一次登入時,可能會有一些使用者導引的提示(tips)。這時,我們可以檢查畫面中是否有這個提示,如果有,就將它關閉。儘管 Robot Framework 提供了 IF ELSE 功能,但連官方都建議,當邏輯較為複雜時,應將這個邏輯拆分,不管是透過 python 自定義關鍵字,或是拆出單獨的 keyword 都可以,不要全部寫在測試案例中。下面我們一起來看看 Robot Framework 的邏輯判斷寫法吧:
Robot Framework 的邏輯判斷需要以 IF 為開頭,需要大寫,以及 END 結尾,總結來說就是 IF END 包起來才可以正常的執行,雖然在這裡不強迫 IF 後面需要縮排,但是為了閱讀方面,建議還是需要縮排一下,在下面的範例中,我們有個變數 fruit 是 apple,下方的 if 為,當 fruit 是 apple 時 Log 出 I have an apple,若不是從不印出,最後的結果為打印出 I have an apple。
*** Variables ***
${fruit} = apple
*** Test Cases ***
Test Case 001
IF '${fruit}' == 'apple'
Log To Console I have an apple
END
如同許多程式語言一樣,Robot Framework 也有提供 ELSE IF 及 ELSE 的用法,下面的範例為,判斷我 fruit 為哪種水果,如果不是 apple 或是 bananas 就印出 The fruit is not a banana or an apple,有的話則顯示該水果:
*** Test Cases ***
Test Case 001
IF '${fruit}' == 'apple'
Log To Console I have an apple
ELSE IF '${fruit}' == 'bananas'
Log To Console I like bananas
ELSE
Log To Console The fruit is not a banana or an apple
END
當然也有提供巢狀 IF 的用法囉,但是如果真的需要判斷到許多層,還是建議拆分出 Test Case,這樣對於後續的維護會比較方便,下面我們來看個例子,當今天水果不是蘋果時,我們就不買,當今天水果是蘋果,但是價格大於 100 元時,我們就說太貴啦,如果小於 100 的話就買:
*** Test Cases ***
Test Case 001
IF '${fruit}' == 'apple'
IF ${price} < 100
Log To Console Buy!
ELSE
Log To Console too expensive!
END
ELSE
Log To Console No need to buy
END
與 Python 相同,在 Robot Framework 中我們一樣要給予一個變數及可以迭代的值,而在 Robot Framework 中的 FOR 語法是有大小寫區分的,結束後需要透過 END 包起來,下面我們可以看看範例,我們透過 for 迴圈分比印出 apple、banana。
*** Test Cases ***
Test Case 001
FOR ${fruit} IN apple banana
Log To Console ${fruit}
END
從 Robot Framework 4.0 後,FOR loops 也開始支援 python 巢狀迴圈的寫法,下面一起看看範例:
*** Test Cases ***
Test Case 001
FOR ${fruit} IN apple banana
FOR ${size} IN small medium large
Log To Console ${fruit}_${size}
END
END
印出來的結果如下,我們分別打印出兩種水果加上三種尺寸的組合:
==============================================================================
Test :: Test Control Structures
==============================================================================
Test Case 001 apple_small
apple_medium
apple_large
banana_small
banana_medium
banana_large
Test Case 001 | PASS |
------------------------------------------------------------------------------
Test :: Test Control Structures | PASS |
1 test, 1 passed, 0 failed
==============================================================================
當我們需要執行固定得迴圈數量時,可以透過與 python 一樣的 for i in range(10)
來執行,這邊也與 python 同,Log 出來的值會是從 0 開始,然後到 9 就結束:
*** Test Cases ***
Test Case 001
FOR ${index} IN RANGE 10
Log To Console ${index}
END
這個也與 python 相同的概念,我們也可以對字典 (Dictionary) 的資料做迭代:
*** Variables ***
&{user} name=max gender=male
*** Test Cases ***
Test Case 001
FOR ${key} ${value} IN &{user}
Log To Console Key is '${key}' and value is '${value}'.
END
在 Robot Framework 也有提供 while 的用法,並且為了避免測試進入無窮迴圈,Robot Framework 非常貼心的預設了 10,000 次的迭代次數限制。這個限制也可以根據需求通過 limit 配置參數進行調整,下面的範例可以看到我們設置了 WHILE True
,理論上已經進入到無窮迴圈了,但是多虧 limit 讓我們最多 10 次便停下來了。
*** Test Cases ***
Test Case 001
WHILE True limit=10
Log This is run 10 times.
END
控制結構可以說是每個語言都必須學習的必修課,在 Robot Framework 中也不例外,它們讓我們能夠實現更為複雜的邏輯操作,從而讓測試案例更加靈活和有彈性。雖然 Robot Framework 提供了強大的 if-else 和 for loop 等控制結構,但其語法和結構對於習慣其他語言的人來說可能會有些不直觀。不過,理解並熟練掌握這些控制結構後,我們可以更好地控制測試的執行流程,讓測試更貼合實際需求。